package ClasesDAO;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import tp.disenio.client.CompetenciaDTO;
import tp.disenio.factory.JpaUtil;
import tp.disenio.shared.Deporte;
import tp.disenio.shared.Disponibilidad;
import tp.disenio.shared.DisponibilidadPK;
import tp.disenio.shared.Estadodecompetencia;
import tp.disenio.shared.Fecha;
import tp.disenio.shared.Localidad;
import tp.disenio.shared.Logresultado;
import tp.disenio.shared.Lugarderealizacion;
import tp.disenio.shared.Modalidad;
import tp.disenio.shared.Participante;
import tp.disenio.shared.Partido;
import tp.disenio.shared.Puntuacion;
import tp.disenio.shared.Renglontablaposiciones;
import tp.disenio.shared.Resultado;
import tp.disenio.shared.Resultadofinal;
import tp.disenio.shared.Sets;
import tp.disenio.shared.Tipodedocumento;
import tp.disenio.shared.Tipodepuntuacion;


public class DAO_General {
	
	
	/**
	 * 
	 * @return
	 */
	public static int getNuevoIdFecha() {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT F.idFecha FROM Fecha F");		
			List resultList = query.getResultList();
			int cantidad = resultList.size();
			
		em.getTransaction().commit();
		
		return (cantidad + 1);
	}
	
	public static void guardarLogResultado(Logresultado logresultado){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();

		em.getTransaction().begin();
			
			em.persist(logresultado);
			
		em.getTransaction().commit();
	}
	
	public static int getNuevoIdResultado() {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT R.idResultado FROM Resultado R");		
			List resultList = query.getResultList();
			int cantidad = resultList.size();
			
		em.getTransaction().commit();
		
		return (cantidad + 1);
	}
	
	public static int getNuevoIdResultadoPuntuacion() {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
			
			Query query = em.createQuery("SELECT P.idPuntuacion FROM Puntuacion P");		
			List resultList = query.getResultList();
			int cantidad = resultList.size();
			
		em.getTransaction().commit();
		
		return (cantidad + 1);
	}
	
	
	/**
	 * 
	 * @return
	 */
	public static int getNuevoIdPartido() {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT P.idPartido FROM Partido P");		
			List resultList = query.getResultList();
			int cantidad = resultList.size();
			
		em.getTransaction().commit();
		
		return (cantidad);
	}
	
	
	/**
	 * 
	 * @param n_deporte
	 * @return
	 */
	public static Deporte getDeportePorNombre(String n_deporte) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT D FROM Deporte D WHERE D.nombre = \"" + n_deporte + "\"");		
			Deporte deporte = (Deporte)query.getSingleResult();
			
		em.getTransaction().commit();
		
		return deporte;
	}

	
	/**
	 * 
	 * @param idUsuario
	 * @param nombreCompetencia
	 * @return
	 */
	public static String getTipoDePuntuacion(String usuario, String nombreCompetencia) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		int idUsuario = UsuarioDAO.getIdUsuarioPorMail(usuario);
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT T.nombre FROM Competencia C, Tipodepuntuacion T WHERE C.usuario.idUsuario = " + idUsuario + " AND C.nombre = \"" + nombreCompetencia +
										 "\" AND C.tipodepuntuacion.idTipoPuntuacion = T.idTipoPuntuacion");		
			String tipoDePuntuacion = (String)query.getSingleResult();	
		
		em.getTransaction().commit();
		
		return tipoDePuntuacion;
	}
	
	
	/**
	 * 
	 * @param string
	 * @return
	 */
	
	public static Estadodecompetencia getEstadoPorNombre(String n_estado) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT E FROM Estadodecompetencia E WHERE E.nombre = \"" + n_estado + "\"");		
			Estadodecompetencia estadoDeCompetencia = (Estadodecompetencia)query.getSingleResult();
			
		em.getTransaction().commit();
		
		return estadoDeCompetencia;
	}

	
	/**
	 * 
	 * @param n_modalidad
	 * @return
	 */
	public static Modalidad getModalidadPorNombre(String n_modalidad) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT M FROM Modalidad M WHERE M.nombre = \"" + n_modalidad + "\"");				
			Modalidad modalidad = (Modalidad)query.getSingleResult();
			
		em.getTransaction().commit();
		
		return modalidad;
	}

	
	/**
	 * 
	 * @param n_tipo_de_puntuacion
	 * @return
	 */
	public static Tipodepuntuacion getTipoDePuntuacionPorNombre(String n_tipo_de_puntuacion) {
	
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT T FROM Tipodepuntuacion T WHERE T.nombre = \"" + n_tipo_de_puntuacion + "\"");				
			Tipodepuntuacion tipodepuntuacion = (Tipodepuntuacion)query.getSingleResult();
			
		em.getTransaction().commit();
		
		return tipodepuntuacion;
	}

	
	/**
	 * 
	 * @param nomTipoDoc
	 * @return
	 */
	public static Tipodedocumento getTipoDocPorNombre(String nomTipoDoc) {	
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT T FROM Tipodedocumento T WHERE T.nombre = \"" + nomTipoDoc + "\"");			
			Tipodedocumento tipoDeDoc = (Tipodedocumento)query.getSingleResult();
			
		em.getTransaction().commit();
		
		return tipoDeDoc;
	}

	
	/**
	 * 
	 * @param id_localidad
	 * @return
	 */
	public static Localidad getLocalidadPorID(int id_localidad) {		
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT L FROM Localidad L WHERE L.idLocalidad = " + id_localidad);				
			Localidad localidad = (Localidad)query.getSingleResult();
			
		em.getTransaction().commit();		
		
		return localidad;
	}


	/**
	 * 
	 * @param id_competencia
	 * @param id_partido
	 * @return
	 */
	public static Partido getPartidoPorID(int id_competencia, int idPartido) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT P FROM Partido P WHERE P.idPartido = " + idPartido);				
			Partido partido = (Partido)query.getSingleResult();
			
		em.getTransaction().commit();		
		
		return partido;
	}


	/**
	 * 
	 * @param id_competencia
	 * @param nombreLocal
	 * @param nombreVisitante
	 * @return
	 */
	public static Partido getPartidoPorParticipantes(int id_competencia, String nombreLocal, String nombreVisitante) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT P FROM Partido P, Participante Pa1, Participante Pa2  WHERE Pa1.nombre = \"" + nombreLocal + "\" AND " +
										 "Pa1.idParticipante = P.participante1.idParticipante AND Pa2.nombre = \"" + nombreVisitante + "\" AND " +
										 "Pa2.idParticipante = P.participante2.idParticipante");		
			
			Partido partido = (Partido)query.getSingleResult();
			
		em.getTransaction().commit();		
		
		return partido;
	}
	
	
	
	
	
	/**
	 * 
	 * @param id_competencia
	 * @param partido
	 */
	public static void actualizarPartido(Partido partido) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
					
			em.merge(partido);
			em.flush();
							
		em.getTransaction().commit();		
	}

	
	public static void actualizarResultado(Resultado resultado){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();

			em.merge(resultado);
			em.flush();
						
		em.getTransaction().commit();	
		
		
	}
	
	public static void actualizarResultadoFinal(Resultadofinal resultadoFinal){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();

			em.merge(resultadoFinal);
			em.flush();
						
		em.getTransaction().commit();	
		
		
	}
	
	public static void actualizarSets(Sets set){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();

			em.merge(set);
			em.flush();
						
		em.getTransaction().commit();	
		
		
	}

	
	public static void actualizarPuntuacion(Puntuacion puntuacion){
		
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
			
			em.merge(puntuacion);
			em.flush();
						
		em.getTransaction().commit();	
		
	}
	/**
	 * 
	 * @param participante
	 * @return
	 */
	public static Renglontablaposiciones getRenglonPorParticipante(Participante participante) {		
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT R FROM renglontablaposiciones R WHERE R.FK_id_participante = "+participante.getIdParticipante());				
			Renglontablaposiciones renglontablaposiciones = (Renglontablaposiciones)query.getSingleResult();
			
		em.getTransaction().commit();		
		
		return renglontablaposiciones;
	}


	/**
	 * 
	 * Metodo que retorna una ListaSimple que contiene Strings con los elementos de la columna Nombre
	 * de la tabla cuyo nombre es pasado como "n".
	 * 
	 * @param listbox
	 * @return
	 */
	public static ArrayList<String> getCamposListbox(String nombreTabla) {

		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT n.nombre FROM " + nombreTabla + " n");		
			ArrayList<String> camposString = new ArrayList<String>(query.getResultList());
			
		em.getTransaction().commit();		
		camposString.add(0, " ");		
		
		return camposString;
	}


	/**
	 * 
	 * Metodo que retorna una ListaSimple que contiene Strings con los elementos de la columna Nombre
	 * de la tabla Provincia, de las provincias que pertenecen al Pais "pais"
	 * 
	 * @param pais
	 * @return
	 */
	public static ArrayList<String> getCamposListboxProvincia(String pais) {

		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT PR.nombre FROM Pais P, Provincia PR WHERE P.nombre = \"" + pais + "\" AND P.idPais = PR.pais.idPais");		
			ArrayList<String> camposString = new ArrayList<String>(query.getResultList());
			
		em.getTransaction().commit();		
		camposString.add(0, " ");
		
		return camposString;
	}


	/**
	 * 
	 * Metodo que retorna una ListaSimple que contiene Strings con los elementos de la columna Nombre
	 * de la tabla Localidad, de las localidades que pertenecen al Pais "pais" y a la Provincia "provincia"
	 * 
	 * @param pais
	 * @param provincia
	 * @return 
	 */
	public static ArrayList<String> getCamposListboxLocalidad(String pais, String provincia) {

		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT L.nombre FROM Pais P, Provincia PR, Localidad L WHERE P.nombre = \"" + pais + "\" AND PR.nombre = \"" + provincia + "\" AND P.idPais = PR.pais.idPais AND PR.idProvincia = L.provincia.idProvincia ");
			ArrayList<String> camposString = new ArrayList<String>(query.getResultList());
			
		em.getTransaction().commit();		
		camposString.add(0, " ");
		
		return camposString;		
	}


	/**
	 * 
	 * Metodo que retorna una lista simple de las Disponibilidades con sus elementos "cantidad" y "lugarDeRelalizacion"
	 * 
	 * @param id_competencia
	 * @return
	 */
	public static ArrayList<Disponibilidad> getDisponibilidades(int idCompetencia) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
			
			Query query = em.createQuery("SELECT D FROM Disponibilidad D WHERE D.competencia.idCompetencia = "+idCompetencia);			
			ArrayList<Disponibilidad> disponibilidades = new ArrayList<Disponibilidad>(query.getResultList());
			
		em.getTransaction().commit();		
		
		return disponibilidades;		
	}

	
	/**
	 * 
	 * metodo que debe actualizar la tupla correspondiente a la disponibilidad pasada como parametro 
	 * 
	 * @param disponibilidad
	 */
	public static void actualizarDisponibilidad(Disponibilidad disponibilidad) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			em.merge(disponibilidad);
			em.flush();
		
		em.getTransaction().commit();
		
	}
	
	
	/**
	 * 
	 * @param partido
	 */
	public static void guardarPartido(Partido partido) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			em.persist(partido);		
			em.flush();
			
		em.getTransaction().commit();
	}
	
	public static void guardarResultado(Resultado resultado){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
			em.persist(resultado);	
			em.flush();
		em.getTransaction().commit();
	}

	public static void guardarResultadoFinal(Resultadofinal resultadofinal){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			em.persist(resultadofinal);		
			em.flush();
			
		em.getTransaction().commit();
	}
	
	public static void guardarResultadoPuntuacion(Puntuacion resultadoPuntuacion){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			em.persist(resultadoPuntuacion);
			em.flush();
			
		em.getTransaction().commit();
	}

	public static void guardarSets(Sets resultadoSets){
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			em.persist(resultadoSets);		
			em.flush();
			
		em.getTransaction().commit();
	}
	
	

	/**
	 * 
	 * metodo que debe actualizar el lugar de realizacion en tabla del partido pasado como parametro
	 * 
	 * @param partido
	 * @param lugarderealizacion 
	 */
	public static void actualizarLugarDelPartido(Partido partido, Lugarderealizacion lugarderealizacion) {
		 	
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
	
			Query query = em.createQuery("SELECT P FROM Partido P WHERE P.idPartido = "+partido.getIdPartido());
			
			Partido partidon = (Partido)query.getSingleResult();
					
			partidon.setIdRealizacion(partido.getIdRealizacion());
				
		em.getTransaction().commit();
	}


	/**
	 * 
	 * Metodo que retorna el id_localidad de la "localidad" de la "provincia" del "pais"
	 * 
	 * @param pais
	 * @param provincia
	 * @param localidad
	 * @return
	 */
	public static int getIdLocalidad(String pais, String provincia,	String localidad) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();	
		
			Query query = em.createQuery("SELECT  L.idLocalidad FROM Localidad L, Provincia Pr, Pais P WHERE L.nombre = \"" + localidad + "\" AND PR.nombre =  \"" + provincia + "\" AND P.nombre = \"" + pais + "\" AND P.idPais = PR.pais.idPais AND PR.idProvincia = L.provincia.idProvincia");				
			int resultado = (int)query.getSingleResult();
			
		em.getTransaction().commit();
		
		return resultado;
	}


	/**
	 * 
	 * @param id_competencia
	 * @return
	 */
	public static ArrayList<Participante> getParticipantes(int idCompetencia) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();
		
			Query query = em.createQuery("SELECT P FROM Participante P WHERE P.competencia.idCompetencia = " + idCompetencia);
			ArrayList<Participante> participantes = new ArrayList<Participante>(query.getResultList());
			
		em.getTransaction().commit();	
		
		return participantes;
	
	}


	/**
	 * 
	 * @param deporte
	 * @return
	 */
	public static ArrayList<String> getCamposListboxLugaresDeRealizacion(String deporte) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("auslober",System.getProperties());
		EntityManager em = factory.createEntityManager();
		
		em.getTransaction().begin();	
		
			Query query = em.createQuery("SELECT L.nombre FROM Lugarderealizacion L JOIN  L.deportes D WHERE D.nombre = \""+ deporte + "\"");					
			ArrayList<String> camposString = new ArrayList<String>(query.getResultList());
			
		em.getTransaction().commit();
		
		camposString.add(0, " ");
						
		return camposString;
	}
	
}
